{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "celltoolbar": "Tags",
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.5"
    },
    "colab": {
      "name": "Part 07 - Federated Learning with Federated Dataset.ipynb",
      "provenance": [],
      "collapsed_sections": []
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "tags": [
          "parameters"
        ],
        "id": "P6lmftjTkzTf",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "epochs = 50"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ArtWkkAFkzTk",
        "colab_type": "text"
      },
      "source": [
        "# পর্ব ৭ - ফেডারেটেড ডাটাসেটের সাথে ফেডারেটেড লার্নিং\n",
        "\n",
        "এখানে আমরা ফেডারেটেড ডেটাসেট ব্যবহারের জন্য একটি নতুন সরঞ্জাম পরিচিত করি। আমরা পাইটর্চ ডেটাসেট ক্লাসের মতো ব্যবহার করার উদ্দেশ্যে একটি `FederatedDataset` ক্লাস তৈরি করেছি, এবং এটি ফেডারেটেড ডাটালোডার `FederatedDataLoader` কে দেয়া হয়েছে যা কিনা ফেডারেটেড ভঙ্গিতে এটি ইটারেট করবে।\n",
        "\n",
        "\n",
        "লেখক:\n",
        "- Andrew Trask - টুইটারঃ [@iamtrask](https://twitter.com/iamtrask)\n",
        "- Théo Ryffel - গিটহাবঃ [@LaRiffle](https://github.com/LaRiffle)\n",
        "\n",
        "অনুবাদক:\n",
        "- সায়ন্তন দাস - গিটহাবঃ [@ucalyptus](https://github.com/ucalyptus)\n",
        "- Mir Mohammad Jaber - টুইটারঃ [@jabertuhin](https://twitter.com/jabertuhin)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "knqW2LaNkzTn",
        "colab_type": "text"
      },
      "source": [
        "আমরা স্যান্ডবক্সটি ব্যবহার করি যা আমরা শেষ পাঠে আবিষ্কার করেছি"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wSEvvkCLkzTo",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import torch as th\n",
        "import syft as sy\n",
        "sy.create_sandbox(globals(), verbose=False)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8585blNfkzTs",
        "colab_type": "text"
      },
      "source": [
        "এরপর ডাটাসেটের খোঁজ করি"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "j9VEARwakzTu",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "boston_data = grid.search(\"#boston\", \"#data\")\n",
        "boston_target = grid.search(\"#boston\", \"#target\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QMKQg6wtkzT0",
        "colab_type": "text"
      },
      "source": [
        "আমরা একটি মডেল এবং একটি অপ্টিমাইজার লোড করি"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NTGAaf3vkzT2",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "n_features = boston_data['alice'][0].shape[1]\n",
        "n_targets = 1\n",
        "\n",
        "model = th.nn.Linear(n_features, n_targets)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YpF7AXcckzT7",
        "colab_type": "text"
      },
      "source": [
        "এখানে আমরা প্রাপ্ত ডেটাকে `FederatedDataset`-এ  কাস্ট করেছি। সেসব কর্মীদের দেখি যারা আংশিক ডাটা ধরে আছে -"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "CFJGqxxvkzT8",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Cast the result in BaseDatasets\n",
        "datasets = []\n",
        "for worker in boston_data.keys():\n",
        "    dataset = sy.BaseDataset(boston_data[worker][0], boston_target[worker][0])\n",
        "    datasets.append(dataset)\n",
        "\n",
        "# Build the FederatedDataset object\n",
        "dataset = sy.FederatedDataset(datasets)\n",
        "print(dataset.workers)\n",
        "optimizers = {}\n",
        "for worker in dataset.workers:\n",
        "    optimizers[worker] = th.optim.Adam(params=model.parameters(),lr=1e-2)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rLaHUvHUkzUA",
        "colab_type": "text"
      },
      "source": [
        "আমরা এটিকে একটি `FederatedDataLoader` এ রেখেছি এবং অপশনগুলো নির্দিষ্ট করি"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "b79BFKgHkzUC",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "train_loader = sy.FederatedDataLoader(dataset, batch_size=32, shuffle=False, drop_last=False)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CyX9TLDekzUG",
        "colab_type": "text"
      },
      "source": [
        "এবং অবশেষে আমরা epoch এর উপরে iterate করি। খাঁটি এবং স্থানীয় PyTorch প্রশিক্ষণের সাথে এটির তুলনা করলে এদের মধ্যমের মিল দেখতে পারবেন!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nqA1DGv3kzUI",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "for epoch in range(1, epochs + 1):\n",
        "    loss_accum = 0\n",
        "    for batch_idx, (data, target) in enumerate(train_loader):\n",
        "        model.send(data.location)\n",
        "        \n",
        "        optimizer = optimizers[data.location.id]\n",
        "        optimizer.zero_grad()\n",
        "        pred = model(data)\n",
        "        loss = ((pred.view(-1) - target)**2).mean()\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "        \n",
        "        model.get()\n",
        "        loss = loss.get()\n",
        "        \n",
        "        loss_accum += float(loss)\n",
        "        \n",
        "        if batch_idx % 8 == 0:\n",
        "            print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tBatch loss: {:.6f}'.format(\n",
        "                epoch, batch_idx, len(train_loader),\n",
        "                       100. * batch_idx / len(train_loader), loss.item()))            \n",
        "            \n",
        "    print('Total loss', loss_accum)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6KJsCPRKkzUM",
        "colab_type": "text"
      },
      "source": [
        "# অভিনন্দন !!! - সম্প্রদায় যোগদানের সময়!\n",
        "\n",
        "এই নোটবুক টিউটোরিয়ালটি সম্পন্ন করার জন্য অভিনন্দন! আপনি যদি এটি উপভোগ করেন এবং গোপনীয়তা সংরক্ষণ, এআই এবং এআই সরবরাহ চেইনের (ডেটা) বিকেন্দ্রীভূত মালিকানার দিকে আন্দোলনে যোগ দিতে চান, আপনি নিম্নলিখিত উপায়ে এটি করতে পারেন!\n",
        "\n",
        "### গিটহাবে স্টার পাইসাইফ্ট\n",
        "\n",
        "আমাদের কমিউনিটিকে সাহায্য করার সবচেয়ে সহজ পন্থা হলো রিপোজিটোরিতে স্টার দেয়া! এটি আমরা যে দারুন সরঞ্জাম তৈরি করছি সে ব্যাপারে সচেতনতা বৃদ্ধি করতে সাহায্য করে।\n",
        "\n",
        "- [Star PySyft](https://github.com/OpenMined/PySyft)\n",
        "\n",
        "### আমাদের স্ল্যাকে(Slack) যোগ দিন!\n",
        "\n",
        "সর্বশেষতম অগ্রগতিতে আপ টু ডেট রাখার সর্বোত্তম উপায় হলো আমাদের সম্প্রদায়ে যোগদান করা! আপনি [http://slack.openmined.org](http://slack.openmined.org) এ ফর্মটি পূরণ করে এটি করতে পারেন\n",
        "\n",
        "### একটি কোড প্রকল্পে যোগদান করুন!\n",
        "\n",
        "আমাদের কমিউনিটিতে অবদান রাখার সেরা উপায় হলো একজন কোড অবদানকারীতে পরিণত হওয়া। যেকোন সময় আপনি PySyft এর গিটহাব ইস্যুর পেজে যেতে পারেন এবং \"Projects\" দিয়ে বাছাই করবেন। এর মাধ্যমে আপনি যে সকল প্রজেক্টে যোগদান করতে পারবেন সেগুলোর উপরের দিকের টিকেটের ওভারভিউ পাবেন। আপনি যদি কোন প্রজেক্টে জয়েন করতে ইচ্ছুক না হোন, কিন্তু কিছুটা কোডিং করতে ইচ্ছুক সেক্ষেত্রে আপনি \"one off\" মিনি প্রজেক্টগুলো দেখতে পারেন গিটহাব ইস্যুতে \"good first issue\" চিহ্নিত ইস্যুগুলো।\n",
        "\n",
        "- [PySyft Projects](https://github.com/OpenMined/PySyft/issues?q=is%3Aopen+is%3Aissue+label%3AProject)\n",
        "- [Good First Issue Tickets](https://github.com/OpenMined/PySyft/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n",
        "\n",
        "### দান করুন\n",
        "\n",
        "আপনার যদি আমাদের কোডবেজে অবদান রাখারা সময় না হয়, কিন্তু এরপরও আমাদেরকে সমর্থন দিতে চান তাহলে আমাদের উন্মুক্ত সংগ্রহের সমর্থক হতে পারেন। সকল ধরনের দানের অর্থ আমাদের ওয়েব হোস্টিং এবং অন্যান্য কমিউনিটি কার্যক্রমে খরচ হয় যেমন - হ্যাকাথন, মিটাপ।\n",
        "\n",
        "[OpenMined's Open Collective Page](https://opencollective.com/openmined)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "pnwlPQSAkzUO",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}